package br.ufrj.dcc.comp2.projeto.modelos;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Iterator;
import java.util.TreeMap;

/**
 * Recordes
 * @author Bruno(Magoo), Eluan(Acre), Diego(Silvio), Davi.
 *
 */
public class Recordes implements Serializable {

	private static final long serialVersionUID = 1L + 1;
	private TreeMap<String, Integer> recordes;
	private static String enderecoArquivo = "./recordes.sir";

	private Recordes() {
		recordes = new TreeMap<String, Integer>();
	}
		
	/**
	 * Carrega arquivo de recordes.
	 *  
	 */
	public static Recordes abreRecordes() {
		Recordes rec;
		try {
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					enderecoArquivo));
			rec = (Recordes) in.readObject();
		} catch (Exception e) {
			System.out
					.println("Arquivo de recordes não encontrado. Novo arquivo criado.");
			rec = new Recordes();
		}
		return rec;
	}

	/**
	 * Grava arquivo de recordes.
	 *
	 */
	public void salvarRecordes() {
		try {
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(enderecoArquivo));
			out.writeObject(this);
		} catch (Exception e) {
			System.out.println("Falha ao salvar o arquivo de recordes.");
			System.exit(1);
		}
	}

	/**
	 * Adiciona recorde.
	 * @param placar pontos do jogador.
	 * @param jogador nome do jogador.
	 * @return false caso o jogador nao entrou nos recordes.
	 */
	public boolean adicionarRecorde(Integer placar, String jogador) {
		if(placar == null || jogador == null){
			return false;
		}
		
		if (recordes.size() < 10) {
			recordes.put(jogador, placar);
			return true;
		} else if (ehRecorde(placar)) {
			if(recordes.containsKey(jogador)){ //Ja contem o nome do jogador, apenas atualiza o score dele
				if(recordes.get(jogador) < placar){ //Eh claro, soh atualiza se o recorde for melhor ;)
					recordes.put(jogador, placar);
				}
			}else{ //Nao contem o nome do jogador... remove o ultimo e adiciona o novo
				recordes.remove(this.getJogadorMenorPlacar());
				recordes.put(jogador, placar);
			}
			return true;
		}
		return false;
	}

	public TreeMap<String, Integer> getRecordes() {
		return this.recordes;
	}
	
	/**
	 * Ultimo jogador que esta nos recordes (menor placar).
	 * 
	 */
	private String getJogadorMenorPlacar(){
		Iterator<Integer> it = recordes.values().iterator();
		int menor = -1;
		int pontos = 0;
		while(it.hasNext()){
			pontos = it.next();
			if(menor == -1){
				menor = pontos;
			}
			else if(pontos < menor){
				menor = pontos;
			}
		}		
		
		Iterator<String> itNome = recordes.keySet().iterator();
		String sNome;
		while(itNome.hasNext()){
			sNome = itNome.next();
			if(menor == recordes.get(sNome)){
				return sNome;
			}
		}
		
		return "";
	}
	
	/**
	 * Verifica se o placar esta alto o suficiente para entrar nos recordes.
	 * @param placar
	 * 
	 */
	public boolean ehRecorde(int placar){
		if (recordes.size() < 10){
			return true;
		}
		
		Iterator<Integer> it = recordes.values().iterator();
		int menor = -1;
		int pontos = 0;
		while(it.hasNext()){
			pontos = it.next();
			if(menor == -1){
				menor = pontos;
			}
			else if(pontos < menor){
				menor = pontos;
			}
		}
		
		if (placar > menor) {
			return true;
		}		
		return false;
	}
}
